package com.sky.mapper;

import cn.mybatis.mp.core.mybatis.mapper.MybatisMapper;
import com.sky.entity.Userborrowhistory;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDate;
import java.util.Date;

/**
 * 用户借阅历史数据访问层
 * 提供借阅历史相关的数据库操作方法
 * 包括基础的CRUD操作和统计分析功能
 */
@Mapper
public interface UserborrowhistoryMapper extends MybatisMapper<Userborrowhistory> {

    /**
     * 统计指定日期的借阅数量
     * 统计某一天的借阅记录总数
     * 
     * @param date 指定日期
     * @return 该日期的借阅总数
     */
    @Select("SELECT COUNT(*) FROM userborrowhistory WHERE DATE(borrow_date) = #{date}")
    Integer countByDate(LocalDate date);

    /**
     * 统计指定周的借阅数量
     * 使用MySQL的YEARWEEK函数计算周数
     * 统计指定周的借阅记录总数
     * 
     * @param weekStart 周开始日期
     * @return 该周的借阅总数
     */
    @Select("SELECT COUNT(*) FROM userborrowhistory WHERE YEARWEEK(borrow_date) = YEARWEEK(#{weekStart})")
    Integer countByWeek(LocalDate weekStart);

    /**
     * 统计指定月份的借阅数量
     * 使用DATE_FORMAT函数提取年月进行比较
     * 统计指定月份的借阅记录总数
     * 
     * @param monthStart 月份开始日期
     * @return 该月份的借阅总数
     */
    @Select("SELECT COUNT(*) FROM userborrowhistory WHERE DATE_FORMAT(borrow_date, '%Y-%m') = DATE_FORMAT(#{monthStart}, '%Y-%m')")
    Integer countByMonth(LocalDate monthStart);

    /**
     * 统计指定时间范围内的借阅数量
     */
    @Select("SELECT COUNT(*) FROM userborrowhistory WHERE borrow_date BETWEEN #{startTime} AND #{endTime}")
    Integer countBorrowingsByTimeRange(@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 统计当前借出数量（未归还的图书数量）
     */
    @Select("SELECT COUNT(*) FROM userborrowhistory WHERE return_date IS NULL")
    Integer countCurrentBorrowings();

    /**
     * 统计指定时间点的借出数量
     */
    @Select("SELECT COUNT(*) FROM userborrowhistory WHERE borrow_date <= #{time} AND (return_date IS NULL OR return_date > #{time})")
    Integer countBorrowingsAtTime(@Param("time") Date time);

    /**
     * 统计当前逾期数量
     */
    @Select("SELECT COUNT(*) FROM userborrowhistory WHERE return_date IS NULL AND due_date < NOW()")
    Integer countCurrentOverdue();

    /**
     * 统计指定时间点的逾期数量
     */
    @Select("SELECT COUNT(*) FROM userborrowhistory WHERE return_date IS NULL AND due_date < #{time}")
    Integer countOverdueAtTime(@Param("time") Date time);

    /**
     * 统计指定日期的读者活跃度（借阅和归还的总次数）
     * @param date 指定日期
     * @return 活跃度数据
     */
    @Select("SELECT COUNT(*) FROM userborrowhistory " +
            "WHERE DATE(borrow_date) = #{date} " +
            "OR DATE(return_date) = #{date}")
    Integer countDailyActivity(Date date);
}
